<?php

/**
 * Inicialmente esta classe armazenará todas as configurações guardadas no arquivo core/config/[pasta_aplicativo]/config.xml
 * incluindo a lista de páginas válidas pelo sistema, url final, url temporárias nomes e demais configurações
 * Ela será inicializada pela classe CORE e repassada para todos os controles em tempo de execução
 * 
 * @author Cristiano M. Gomes <cmgomes.es@gmail.com>
 */
class Sistema{
	/**
	 * Propriedade singleton do objeto
	 *
	 * @var unknown_type
	 */
	private static $instancia = null;

	/**
	 * Retorna o objeto Config_Paginas com as lista de páginas listadas no config.xml da aplicação
	 *
	 * @var Config_Paginas
	 */
	private $paginas;
	
	/**
	 * Retorna o objeto Config_Site com informações do site no config.xml da aplicação
	 *
	 * @var Config_Site
	 */
	private $site;

	private $versao = "1.0 beta";

	public function GetVersao(){
		return $this->versao;
	}

	private static $medidor;

	public function SetMedidor($bool){
		Sistema::$medidor = $bool;
	}

	public function GetMedidor(){
		return Sistema::$medidor;
	}

	/**
	 * Retorna o objeto Config_Database com informações de banco de dados no config.xml da aplicação
	 *
	 * @var Config_Database
	 */
	private $database;

	private $pagina;

	/**
	 * Método que retorna a página atual que está sendo acessada
	 *
	 * @return Config_Paginas
	 */
	public function GetPaginaAtual(){
		return $this->pagina;
	}

	/**
	 * Configura a página atual solicitada pelo sistema
	 * @param Config_Paginas $pagina
	 */
	public function SetPaginaAtual($pagina){
		$this->pagina = $pagina;
	}

	public function SetView($file){
		if(Sistema::GetInstancia()->GetMedidor()) Velocimetro::GetInstancia()->Start("Sistema::SetView");
		
		$pagina = $this->GetPaginaAtual()->SetArquivo($file);
		if($pagina instanceof Config_Paginas) $this->SetPaginaAtual($pagina);
		
		if(Sistema::GetInstancia()->GetMedidor()) Velocimetro::GetInstancia()->End("Sistema::SetView");
	}
	/**
	 * Método de retorno do objeto Sessao do sistema
	 *
	 * @return Sessao
	 */
	public function GetSessao(){
		return Sessao::GetInstanciar();
	}
	
	/**
 	 * ControleBase Controle php a ser chamado
 	 * 
 	 * @var string
 	 * @access private
 	 */
 	private $controle_base;
 	public function GetControleBase(){ return $this->controle_base; }
	
 	public function SetControleBase($valor){
 		$this->controle_base = $valor;
 	}

 	/**
 	 * Parametros Lista de parâmetros enviadas pela requisição
 	 *
 	 * @var array
 	 */
 	private $Parametros;

 	/**
 	 * Método de gerenciamento dos parametros
 	 *
 	 * @param string $param
 	 * @return variavel
 	 */
 	public function GetParametros($param = ''){ 
 		if(Sistema::GetInstancia()->GetMedidor()) Velocimetro::GetInstancia()->Start("Sistema::GetParametros");
 		
		if(!$param){
			
			if(Sistema::GetInstancia()->GetMedidor()) Velocimetro::GetInstancia()->End("Sistema::GetParametros");
			return $this->Parametros; 
		}else{
			$parans  = $this->Parametros;
			if(isset($parans[$param])){
				
				if(Sistema::GetInstancia()->GetMedidor()) Velocimetro::GetInstancia()->End("Sistema::GetParametros");
				return $parans[$param];
			}
			
			if(Sistema::GetInstancia()->GetMedidor()) Velocimetro::GetInstancia()->End("Sistema::GetParametros");
			return false;
		}
	}

	/**
	 * Configura a propriedade valido que indica para o sistema se a página é válida ou não
	 * @param boolean
	 */
	public function SetValidade($boolean){
		if(Sistema::GetInstancia()->GetMedidor()) Velocimetro::GetInstancia()->Start("Sistema::SetValidade");
		
		$sm = StateManager::GetInstancia();
		if($boolean){
			$sm->PageState()->SetValido();
		}else{
			$sm->PageState()->SetInvalido();
		}
		
		if(Sistema::GetInstancia()->GetMedidor()) Velocimetro::GetInstancia()->End("Sistema::SetValidade");
	}
	
	public function SetParametros($nome_param, $valor_param){
		$this->Parametros[$nome_param] = $valor_param;
	}

	/**
	 * Método construtor da classe, carrega o arquivo config.xml da aplicação e configura os objetos
	 * responsávels por armazenar cada tipo de informação
	 *
	 * @return void
	 */
    function  __construct(){
        $xml = DIR_CONFIG . 'config.xml';
        if(file_exists($xml))
        {
            $xml = simplexml_load_file($xml);

            $this->paginas = $xml->paginas;
            $this->site = $xml->site;
            $this->database = $xml->db;
        }
    }

	/**
	 * Esta função coleta os dados do arquivo log.xml de log do msn e apresenta os diálogos na tela.
	 */ 	
	public function ListaLog(){
		if(Sistema::GetInstancia()->GetMedidor()) Velocimetro::GetInstancia()->Start("Sistema::ListaLog");
		
		$log = DIR_CONFIG . 'log.xml';
		if(file_exists($log)){
			$xml = simplexml_load_file($log);

			for($i = 0; $i < sizeof($xml->Message); $i++){
				$atrib = $xml->Message[$i]->From->User->attributes();
				$nome = $atrib['FriendlyName'][0];
				echo "<b>" . $nome . ':</b> ';
				echo $xml->Message[$i]->Text;
				echo '<br />';
			}
		}else{
			echo "deu zica";die();
		}
		
		if(Sistema::GetInstancia()->GetMedidor()) Velocimetro::GetInstancia()->End("Sistema::ListaLog");
	}

    /**
     * Retorna uma página específica passada por parâmetro ou array com todas as páginas
     *  
     * @param string $nome	nome da página a ser carregada
     * @return Config_Paginas
     */
	public function GetPaginas($nome = ''){
		if(Sistema::GetInstancia()->GetMedidor()) Velocimetro::GetInstancia()->Start("Sistema::GetPaginas");
		if($nome){
			foreach($this->paginas->item as $pag){
				if($pag->nome == $nome){
					$ajax = ($pag->ajax) ? true : false;
					$pagina = new config_Paginas($pag->nome, $pag->arquivo, $pag->controle, $pag->login, $pag->javascript, $pag->urlconf, $ajax);
				}
			}
			if(Sistema::GetInstancia()->GetMedidor()) Velocimetro::GetInstancia()->End("Sistema::GetPaginas");
			return $pagina;
		}else{
			$array = array();
			foreach($this->paginas->item as $pag){
				$ajax = ($pag->ajax) ? true : false;
				$pagina = new Config_Paginas($pag->nome, $pag->arquivo, $pag->controle, $pag->login, $pag->javascript, $pag->urlconf, $ajax);
				array_push($array, $pagina);
			}
			if(Sistema::GetInstancia()->GetMedidor()) Velocimetro::GetInstancia()->End("Sistema::GetPaginas");
			return $array;
		}
	}

	/**
	 * Método que fornece o objeto site com informações sobre o site armazenados no config.xml da aplicação
	 *
	 * @return Config_Site
	 */
	public function GetSite(){
		if(Sistema::GetInstancia()->GetMedidor()) Velocimetro::GetInstancia()->Start("Sistema::GetSite");
		$sis = $this->site;
		$ajax = ($sis->ajax) ? true : false;
	    $Site = new Config_Site($sis->nome, $sis->url, $sis->urlconf, $ajax);
	    
	    if(Sistema::GetInstancia()->GetMedidor()) Velocimetro::GetInstancia()->End("Sistema::GetSite");
	    return $Site;
	}

	/**
	 * Método que fornece o objeto site com informações de database armazenados no config.xml da aplicação
	 *
	 * @return Config_Database
	 */
	public function GetDatabase(){
		if(Sistema::GetInstancia()->GetMedidor()) Velocimetro::GetInstancia()->Start("Sistema::GetDatabase");
		
		$db = $this->database;
		$Database = new Config_Database($db->host, $db->base, $db->usuario, $db->senha, $db->porta, $db->dbtype);
		
		if(Sistema::GetInstancia()->GetMedidor()) Velocimetro::GetInstancia()->Start("Sistema::GetDatabase");
		return $Database;
	}

	/**
	 * Verifica se a página requisitada consta no arquivo xml e existe nas pastas definidas
	 * 
	 * @return boolean
	 */
	public function ValidaPagina(){
		if(Sistema::GetInstancia()->GetMedidor()) Velocimetro::GetInstancia()->Start("Sistema::ValidaPagina");

		$sm = StateManager::GetInstancia();
		if($sm->PageState()->GetState()){
			$paginas = $this->GetPaginas();
			if($this->GetPaginaAtual()->GetLogin() == 'true'){
				if(!$this->GetSessao()->GetVarSessao('logado')){
					$app_folder = APP_FOLDER . "/login";

					header("location: $app_folder");
					die();
				}
			}

			if(Sistema::GetInstancia()->GetMedidor()) Velocimetro::GetInstancia()->End("Sistema::ValidaPagina");
			return $sm->PageState()->GetState();
		}else{
			if(Sistema::GetInstancia()->GetMedidor()) Velocimetro::GetInstancia()->End("Sistema::ValidaPagina");
			return $sm->PageState()->GetState();
		}
	}

	/**
	 * Método que fornece o singleton do objeto
	 *
	 * @return Sistema
	 */
	public static function GetInstancia(){
		if(!Sistema::$instancia){
			Sistema::$instancia = new Sistema();
		}
		return Sistema::$instancia;
	}
	
}